package com.hospital.config;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Locale;

import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.expression.ParseException;
import org.springframework.format.Formatter;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;

@Configuration
public class DateConverterConfig {

//	/**
//	 * Date格式化字符串
//	 */
//	private static final String DATE_FORMAT = "yyyy-MM-dd";
//	/**
//	 * DateTime格式化字符串
//	 */
//	private static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
//	/**
//	 * Time格式化字符串
//	 */
//	private static final String TIME_FORMAT = "HH:mm:ss";
//
//	/**
//	 * 自定义Bean
//	 *
//	 * @return
//	 */
//	@Bean
//	@Primary
//	public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
//		return builder -> builder
//				.serializerByType(LocalDateTime.class,
//						new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATETIME_FORMAT)))
//				.serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT)))
//				.serializerByType(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(TIME_FORMAT)))
//				.deserializerByType(LocalDateTime.class,
//						new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATETIME_FORMAT)))
//				.deserializerByType(LocalDate.class,
//						new LocalDateDeserializer(DateTimeFormatter.ofPattern(DATE_FORMAT)))
//				.deserializerByType(LocalTime.class,
//						new LocalTimeDeserializer(DateTimeFormatter.ofPattern(TIME_FORMAT)));
//	}

//	/** 默认日期时间格式 */
//	public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
//	/** 默认日期格式 */
//	public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
//	/** 默认时间格式 */
//	public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
//
//	@Bean
//	public ObjectMapper objectMapper() {
//		ObjectMapper objectMapper = new ObjectMapper();
//		objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
//		objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
//		JavaTimeModule javaTimeModule = new JavaTimeModule();
//		javaTimeModule.addSerializer(LocalDateTime.class,
//				new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
//		javaTimeModule.addSerializer(LocalDate.class,
//				new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
//		javaTimeModule.addSerializer(LocalTime.class,
//				new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
//		javaTimeModule.addDeserializer(LocalDateTime.class,
//				new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
//		javaTimeModule.addDeserializer(LocalDate.class,
//				new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
//		javaTimeModule.addDeserializer(LocalTime.class,
//				new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
//		objectMapper.registerModule(javaTimeModule).registerModule(new ParameterNamesModule());
//		return objectMapper;
//	}

//	@Bean
//	public Converter<String, LocalDate> localDateConvert() {
//		return new Converter<String, LocalDate>() {
//			@Override
//			public LocalDate convert(String source) {
//				if (source == null || source.isEmpty()) {
//					return null;
//				}
//				int length = source.length();
//				String pattern = "yyyy-MM-dd";
//				switch (length) {
//					case 4:// 传值为yyyy
//						source += "-01-01";
//						break;
//					case 7:// 传值为yyyy-MM
//						source += "-01";
//						break;
//					default:
//						break;
//				}
//				return LocalDate.parse(source, DateTimeFormatter.ofPattern(pattern));
//			}
//		};
//	}

//	@Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
//    @Value("${spring.jackson.date-format:yyyy-MM-dd}")
//    private String pattern;
//
//     // 方案一
//    @Bean 
//    public LocalDateTimeSerializer localDateTimeDeserializer() { 
//        return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern)); 
//    }
//      
//    @Bean 
//    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { 
//        return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer()); 
//    }

//	@Bean
//	public Converter<String, Date> addNewConvert() {
//		return new Converter<String, Date>() {
//			@Override
//			public Date convert(String source) {
//				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//				Date date = null;
//				try {
//					date = sdf.parse((String) source);
//				} catch (ParseException e) {
//					SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//					try {
//						date = sdf2.parse(source);
//					} catch (ParseException e1) {
//						SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd");
//						try {
//							date = sdf3.parse(source);
//						} catch (ParseException e2) {
//							e2.printStackTrace();
//						}
//					}
//				}
//				return date;
//			}
//		};
//	}
//
//	@Bean
//	public Converter<String, Date> converter() {
//		return new Converter<String, Date>() {
//			@Override
//			public Date convert(String source) {
//				try {
//					if (source != null && !source.isEmpty()) {
//						SimpleDateFormat sdf = null;
//						if (source.length() == 10) {
//							sdf = new SimpleDateFormat("yyyy-MM-dd");
//						} else if (source.length() == 5) {
//							sdf = new SimpleDateFormat("HH:mm");
//						} else if (source.length() == 16) {
//							sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm");
//						} else if (source.length() == 19) {
//							sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
//						}
//						Date date = sdf.parse(source);
//						return date;
//					}
//				} catch (Exception e) {
//					e.printStackTrace();
//				}
//				return null;
//			}
//		};
//	}
}
